package com.hongmeng.common.utils.file;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * 阿里云上传工具类
 *
 * @author hongmeng
 */
@Slf4j
public class ALiYunUploadUtils {


    //阿里云API的内或外网域名
    private static String ENDPOINT="http://oss-cn-shanghai.aliyuncs.com";
    //阿里云API的密钥Access Key ID
    private static String ACCESS_KEY_ID="LTAI4G8bHPj9Ef4Lknny99xC";
    //阿里云API的密钥Access Key Secret
    private static String ACCESS_KEY_SECRET="sDm8jmIFzdbF1T7u7ho9jDYewk5wNW";
//    //阿里云API的密钥Access Key ID
//    private static String ACCESS_KEY_ID="LTAIGurO1Ji5vOnV";
//    //阿里云API的密钥Access Key Secret
//    private static String ACCESS_KEY_SECRET="1AZDLTZWZV3iOlMiSCa0hSS0dGu1U7";


    /**
     * 获取阿里云OSS客户端对象
     * */
    public static final OSSClient getOSSClient(){
        return new OSSClient(ENDPOINT,ACCESS_KEY_ID, ACCESS_KEY_SECRET);
    }

    /**
     * 新建Bucket  --Bucket权限:私有
     * @param bucketName bucket名称
     * @return true 新建Bucket成功
     * */
    public static final boolean createBucket(OSSClient client, String bucketName){
        Bucket bucket = client.createBucket(bucketName);
        return bucketName.equals(bucket.getName());
    }

    /**
     * 删除Bucket
     * @param bucketName bucket名称
     * */
    public static final void deleteBucket(OSSClient client, String bucketName){
        client.deleteBucket(bucketName);
    }


    /**
     * 向阿里云的OSS存储中存储文件  --file也可以用InputStream替代
     * @param client OSS客户端
     * @param bucketName bucket名称
     * @param diskName 上传文件的目录  --bucket下文件的路径
     * @return String 唯一MD5数字签名
     * */
    public static final String uploadObjectToAPK(OSSClient client, InputStream is, String bucketName, String diskName, String fileName, Long fileSize) {
        String resultStr = null;
        try {
            //这里的inputStream.available()就是获取这个inputstream的大小
            //创建上传Object的Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(fileSize);
            metadata.setCacheControl("no-cache");
            metadata.setHeader("Pragma", "no-cache");
            metadata.setContentEncoding("utf-8");
            metadata.setContentType(getContentType(fileName));
            metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
            //上传文件
            PutObjectResult putResult = client.putObject(bucketName, diskName + fileName, is, metadata);
            //解析结果
            resultStr = putResult.getETag();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultStr;
    }

    /**
     * 向阿里云的OSS存储中存储文件  --file也可以用InputStream替代
     * @param client OSS客户端
     * @param bucketName bucket名称
     * @param diskName 上传文件的目录  --bucket下文件的路径
     * @return String 唯一MD5数字签名
     * */
    public static final String uploadObject2OSS(OSSClient client, InputStream is, String bucketName, String diskName, String fileName, Long fileSize) {
        String resultStr = null;
        try {
            //这里的inputStream.available()就是获取这个inputstream的大小
            //创建上传Object的Metadata
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(is.available());
            metadata.setCacheControl("no-cache");
            metadata.setHeader("Pragma", "no-cache");
            metadata.setContentEncoding("utf-8");
            metadata.setContentType(getContentType(fileName));
            metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte.");
            //上传文件
            PutObjectResult putResult = client.putObject(bucketName, diskName + fileName, is, metadata);
            //解析结果
            resultStr = putResult.getETag();
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return resultStr;
    }

    /**
     * 根据key获取OSS服务器上的文件输入流
     * @param client OSS客户端
     * @param bucketName bucket名称
     * @param diskName 文件路径
     * @param key Bucket下的文件的路径名+文件名
     */
    public static final InputStream getOSS2InputStream(OSSClient client, String bucketName, String diskName, String key){
        OSSObject ossObj = client.getObject(bucketName, diskName + key);
        return ossObj.getObjectContent();
    }

    /**
     * 根据key删除OSS服务器上的文件
     * @param client OSS客户端
     * @param bucketName bucket名称
     * @param diskName 文件路径
     * @param key Bucket下的文件的路径名+文件名
     */
    public static void deleteFile(OSSClient client, String bucketName, String diskName, String key){
        client.deleteObject(bucketName, diskName + key);
    }

    public static final BufferedReader downloadFile(OSSClient client, String bucketName, String diskName, String key){
        OSSObject ossObj = client.getObject(bucketName, diskName + key);
        BufferedReader reader = new BufferedReader(new InputStreamReader(ossObj.getObjectContent()));
        try {
            while (true) {
                String line = reader.readLine();
                if (line == null) break;

                System.out.println("\n" + line);
            }
            reader.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        return reader;
    }

    /**
     * 通过文件名判断并获取OSS服务文件上传时文件的contentType
     * @param fileName 文件名
     * @return 文件的contentType
     */
    public static final String getContentType(String fileName){
        if (!fileName.contains(".")){return "application/octet-stream";}
        String fileExtension = fileName.substring(fileName.lastIndexOf("."));
        if(".bmp".equalsIgnoreCase(fileExtension)) {return "image/bmp";}
        if(".gif".equalsIgnoreCase(fileExtension)) {return "image/gif";}
        if(".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension)  || ".png".equalsIgnoreCase(fileExtension) ) {return "image/jpeg";}
        if(".html".equalsIgnoreCase(fileExtension)) {return "text/html";}
        if(".txt".equalsIgnoreCase(fileExtension)) {return "text/plain";}
        if(".vsd".equalsIgnoreCase(fileExtension)) {return "application/vnd.visio";}
        if(".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {return "application/vnd.ms-powerpoint";}
        if(".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {return "application/msword";}
        if(".xml".equalsIgnoreCase(fileExtension)) {return "text/xml";}
        if(".pdf".equalsIgnoreCase(fileExtension)) {return "application/pdf";}
        if(".csv".equalsIgnoreCase(fileExtension)) {return "application/octet-stream";}
        if(".apk".equalsIgnoreCase(fileExtension)) {return "application/vnd.android.package-archive";}
        return "application/octet-stream";
    }


}
                                                  